/*
 * JVM_OpcodeStack.c
 *
 *  Created on: 04.01.2011
 *      Author: Tavin
 */

#include <stdint.h>

#include "JVM_StatusCodes.h"
#include "JVM_Opcode.h"
#include "JVM_OpcodeStack.h"


/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_pop									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.4			Status : Working   			*/
/*																						*/
/****************************************************************************************/


uint16_t JVM_cmd_pop()
{
	JVM_Opcode_popIntValue();

	return(STCD_OK);
}

/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_pop2									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.4			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_pop2()
{
	JVM_Opcode_popLongValue();

	return(STCD_OK);
}




/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_dup									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_dup()
{
	int32_t value;

	value=JVM_Opcode_popIntValue();

	JVM_Opcode_pushIntValue(value);
	JVM_Opcode_pushIntValue(value);


	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_dup_x1								Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_dup_x1()
{
	int32_t value1;
	int32_t value2;

	value1=JVM_Opcode_popIntValue();
	value2=JVM_Opcode_popIntValue();

	JVM_Opcode_pushIntValue(value1);
	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);

	return(STCD_OK);
}

/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_dup_x2								Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_dup_x2()
{
	int32_t value1;
	int32_t value2;
	int32_t value3;

	value1=JVM_Opcode_popIntValue();
	value2=JVM_Opcode_popIntValue();
	value3=JVM_Opcode_popIntValue();

	JVM_Opcode_pushIntValue(value1);
	JVM_Opcode_pushIntValue(value3);
	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);

	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_dup2									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_dup2()
{
	int64_t value;

	value=JVM_Opcode_popLongValue();

	JVM_Opcode_pushLongValue(value);
	JVM_Opcode_pushLongValue(value);


	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_dup2_x1								Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_dup2_x1()
{
	int32_t value1;
	int32_t value2;
	int32_t value3;

	value1=JVM_Opcode_popIntValue();
	value2=JVM_Opcode_popIntValue();
	value3=JVM_Opcode_popIntValue();

	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);
	JVM_Opcode_pushIntValue(value3);
	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);

	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_dup2_x2								Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_dup2_x2()
{
	int32_t value1;
	int32_t value2;
	int32_t value3;
	int32_t value4;

	value1=JVM_Opcode_popIntValue();
	value2=JVM_Opcode_popIntValue();
	value3=JVM_Opcode_popIntValue();
	value4=JVM_Opcode_popIntValue();

	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);
	JVM_Opcode_pushIntValue(value4);
	JVM_Opcode_pushIntValue(value3);
	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);

	return(STCD_OK);
}
/****************************************************************************************/
/*																						*/
/*	Function : JVM_cmd_swap									Author : OG					*/
/*																						*/
/*	Description : 								   										*/
/*																						*/
/*	Version : 1.0					Date :2011.1.5			Status : Working   			*/
/*																						*/
/****************************************************************************************/

uint16_t JVM_cmd_swap()
{
	int32_t value1;
	int32_t value2;

	value2=JVM_Opcode_popIntValue();
	value1=JVM_Opcode_popIntValue();

	JVM_Opcode_pushIntValue(value2);
	JVM_Opcode_pushIntValue(value1);


	return(STCD_OK);
}
